home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / MSDOS / mouse.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  4KB  |  195 lines

  1. /* --------------------------------- mouse.c -------------------------------- */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* Handler for the mouse as a pointing device.
  8. */
  9.  
  10. #include "fly.h"
  11.  
  12. #include <dos.h>
  13.  
  14.  
  15. #define USELOG        0x0001        /* log scale on x/y (default) */
  16.  
  17. #define PO        p->opt
  18. #define FA1D        PO[0]
  19. #define FA1F        PO[1]
  20. #define FA2D        PO[2]
  21. #define FA2F        PO[3]
  22. #define FSPEEDX        PO[4]
  23. #define FSPEEDY        PO[5]
  24. #define FOPTS        PO[6]
  25.  
  26. static int    nbuttons = 2;
  27.  
  28. LOCAL_FUNC int FAR
  29. MikCal (POINTER *p)
  30. {
  31.     union REGS    rg;        /* cpu register for use of DOS calls */
  32.  
  33.     rg.x.ax = 4;            /* set mouse cursor position */
  34.     rg.x.cx = 100 << 3;        /* middle col */
  35.     rg.x.dx = 100 << 3;        /* middle row */
  36.     int86(0x33, &rg, &rg);
  37.     p->a[FA1F] = p->a[FA2F] = 0;
  38.     p->l[FA1F] = p->l[FA2F] = 0;
  39.     return (0);
  40. }
  41.  
  42. LOCAL_FUNC int FAR
  43. MikInit (POINTER *p, char *options)
  44. {
  45.     union REGS    rg;        /* cpu register for use of DOS calls */
  46.     struct SREGS segreg;        /* cpu segment registers         */
  47.     long        miaddr;        /* mouse interupt routine address */
  48.     long        l;
  49.  
  50.     p->flags = 0;
  51.  
  52. /* check if the mouse drive exists first
  53. */
  54.     rg.x.ax = 0x3533;        /* look at the interrupt 33 address */
  55.     int86x(0x21, &rg, &rg, &segreg);
  56.     miaddr = (((long)segreg.es) << 16) + (long)rg.x.bx;
  57.     if (0 == miaddr || 0x0cf == *(char FAR *)miaddr)
  58.         return (1);
  59.  
  60. /* check for mouse present
  61. */
  62.     rg.x.ax = 0;            /* mouse status flag */
  63.     int86(0x33, &rg, &rg);        /* check for the mouse interupt */
  64.     if (rg.x.ax == 0)
  65.         return (2);
  66.     p->flags |= PF_PRESENT;
  67.     nbuttons = rg.x.bx;
  68.  
  69.     if (get_narg (options, "sx=", &l))
  70.         FSPEEDX = 2;
  71.     else
  72.         FSPEEDX = (int)l;
  73.  
  74.     if (get_narg (options, "sy=", &l))
  75.         FSPEEDY = 2;
  76.     else
  77.         FSPEEDY = (int)l;
  78.  
  79.     if (get_arg (options, "linear"))
  80.         FOPTS &= ~USELOG;
  81.     else
  82.         FOPTS |= USELOG;
  83.  
  84. #if 0
  85. /* set mouse attributes
  86. */
  87.     rg.x.ax = 10;            /* set text cursor */
  88.     rg.x.bx = 0;            /* software text cursor please */
  89.     rg.x.cx = 0x77ff;        /* screen mask */
  90.     rg.x.dx = 0x7700;        /* cursor mask */
  91.     int86(0x33, &rg, &rg);
  92. #endif
  93.  
  94. /* set number of columns for mouse
  95. */
  96.     rg.x.ax = 7;            /* set min/max horizontal position */
  97.     rg.x.cx = 0;            /* start at 0 */
  98.     rg.x.dx = 200 << 3;    /* end at the end */
  99.     int86(0x33, &rg, &rg);
  100.  
  101. /* set number of vertical rows for mouse
  102. */
  103.     rg.x.ax = 8;            /* set min/max vertical position */
  104.     rg.x.cx = 0;            /* start at 0 */
  105.     rg.x.dx = 200 << 3;    /* end at the end */
  106.     int86(0x33, &rg, &rg);
  107.  
  108. /* set mouse speed
  109. */
  110.     rg.x.ax = 15;
  111.     rg.x.cx = FSPEEDX;
  112.     rg.x.dx = FSPEEDY;
  113.     int86(0x33, &rg, &rg);
  114.  
  115. #if 0
  116. /* turn the mouse cursor on
  117. */
  118.     rg.x.ax = 1;            /* Show Cursor */
  119.     int86(0x33, &rg, &rg);
  120.  
  121. /* turn the mouse cursor back off
  122. */
  123.     rg.x.ax = 2;            /* Hide Cursor */
  124.     int86(0x33, &rg, &rg);
  125. #endif
  126.     p->flags |= PF_INITED;
  127.  
  128. /* get it in the middle of the screen
  129. */
  130.     MikCal (p);
  131.  
  132.     return (0);
  133. }
  134.  
  135. LOCAL_FUNC void FAR
  136. MikTerm (POINTER *p)
  137. {
  138.     p->flags = 0;
  139. }
  140.  
  141. LOCAL_FUNC int FAR
  142. MikRead (POINTER *p, int transfer)
  143. {
  144.     union REGS    rg;
  145.     char        btn[3];
  146.     int        reading;
  147.  
  148.     rg.x.ax = 3;        /* Get button status and mouse position */
  149.     int86(0x33, &rg, &rg);
  150.  
  151.     reading = (rg.x.dx >> 3) - 100;        /* x */
  152.     reading *=  FA2D;
  153.     p->a[FA2F] = reading;
  154.     if (transfer)
  155.         p->l[FA2F] = (FOPTS & USELOG) ? lin2log (reading) : reading;
  156.  
  157.     reading = (rg.x.cx >> 3) - 100;        /* y */
  158.     reading *=  -FA1D;
  159.     p->a[FA1F] = reading;
  160.     if (transfer)
  161.         p->l[FA1F] = (FOPTS & USELOG) ? lin2log (reading) : reading;
  162.  
  163.     btn[0] = T(rg.x.bx & 0x02);        /* right button */
  164.     btn[1] = T(rg.x.bx & 0x01);        /* left button */
  165.     if (nbuttons > 2) {
  166.         btn[2] = T(rg.x.bx & 0x04);    /* middle button ? */
  167.         reading = 3;
  168.     } else
  169.         reading = 2;
  170.     do_btns (p, btn, reading);
  171.  
  172.     return (0);
  173. }
  174.  
  175. struct PtrDriver NEAR PtrMouse = {
  176.     "MOUSE",
  177.     0,
  178.     NULL,    /* extra */
  179.     MikInit,
  180.     MikTerm,
  181.     MikCal,
  182.     MikCal,            /* center */
  183.     MikRead,
  184.     std_key
  185. };
  186. #undef USELOG
  187. #undef PO
  188. #undef FA1D
  189. #undef FA1F
  190. #undef FA2D
  191. #undef FA2F
  192. #undef FSPEEDX
  193. #undef FSPEEDY
  194. #undef FOPTS
  195.